package com.jxs.security.resource.http;

import com.jxs.security.Session;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 当请求进入到{@link SecurityFilterFactoryBean}时，首先执行{@link #onComing(HttpServletRequest)}方法，
 * 如果没抛出异常，那么匹配到{@link UriResource}时再执行{@link #onResourceFound(UriResource, Session, HttpServletRequest)}方法。
 * 这两个方法抛出异常的话会终端本次请求并且交由{@link SecurityAuthcFailHandler#onFail(HttpServletRequest, HttpServletResponse, Exception)})}来处理。
 * @author jiangxingshang
 * @since 16/10/21
 */
public interface OnRequestListener {

    /**
     * 请求进入到过滤器时。
     * @param session
     * @param request
     * @throws Exception 抛出任何异常都会导致后面的验证被打断，并且错误委托给{@link SecurityAuthcFailHandler#onFail(HttpServletRequest, HttpServletResponse, Exception)}给处理。
     * @return 如果返回true表示后面的验证被打断，直接让请求走下一个过滤器。
     */
    boolean onComing(Session session, HttpServletRequest request) throws Exception;

    /**
     * 从请求uri中匹配到一个{@link UriResource}时。
     * @param resource
     * @param session
     * @param request
     * @throws Exception 抛出任何异常都会导致后面的验证被打断，并且错误委托给{@link SecurityAuthcFailHandler#onFail(HttpServletRequest, HttpServletResponse, Exception)}给处理。
     * @return 如果返回true表示后面的验证被打断，直接让请求走下一个过滤器。
     */
    boolean onResourceFound(UriResource resource, Session session, HttpServletRequest request) throws Exception;
}
